package main
import "fmt"

type Address struct {
  Name string
  Phone string
}

func main() {
  var userinfo = make(map[string]interface{})
  userinfo["username"] = "zhangsan"
  userinfo["age"] = 20
  userinfo["hobby"] = []string{"eat", "sleep"}
  fmt.Println(userinfo["username"])
  fmt.Println(userinfo["age"])
  // 我们尝试访问hobby的第2个元素，按照正常思路，访问切片的第二个元素，可以用索引1，但是由于这里map的value是interface{}空接口，空接口并不支持索引访问，所以报错了
  // interface{} does not support indexing
	// 要使用下面这种方法
	hob, ok1 := userinfo["hobby"].([]string)				// sleep
	if ok1 {
		fmt.Println(hob[1])
	} else {
		fmt.Println("hobby not found")
	}

  var address = &Address{
    Name: "lisi",
    Phone: "12345678901",
  }
  userinfo["address"] = address
  // 尝试通过userinfo访问address.Name
  // 按照正常的思路，userinfo["address"].Name。
  // 但是会报错（空接口没有属性也没有方法，不能这样调用）
  // userinfo["address"].Name undefined (type interface {} is interface with no methods)
	ad, ok2 := userinfo["address"].(*Address)
	if ok2 {
		fmt.Println(ad.Name)
	} else {
		fmt.Println("address not found")
	}
}